class Queue {
  constructor() {
    //inStack处理输入
    this.inStack = [];
    //outStack处理输出
    this.outStack = [];
  }

  /**
   * @description 模拟队列在队尾插入数据
   * @param {number} val
   */
  push(val) {
    this.inStack.push(val);
  }

  /**
   * @description 模拟队列从队头删除数据
   * @returns {number} 返回删除的值
   */
  pop() {
    //输出栈中的数据为空，则要从输入栈里倒一次
    if (!this.outStack.length) {
      while (this.inStack.length) {
        this.outStack.push(this.inStack.pop());
      }
    }
    return this.outStack.pop();
  }

  /**
   * @description 读取队头的数据
   */
  front() {
    //输出栈中的数据为空，则要从输入栈里倒一次
    if (!this.outStack.length) {
      while (this.inStack.length) {
        this.outStack.push(this.inStack.pop());
      }
    }
    //取出输出栈栈顶的值
    return this.outStack[this.outStack.length - 1];
  }

  /**
   * @description 取队尾元素
   * @returns {number} 返回队尾元素
   */
  back() {
    //如果输入栈不为空，则栈顶元素就是队尾元素
    if (this.inStack.length) {
      return this.inStack[this.inStack.length - 1];
      //否则，输出栈栈底元素就是队尾元素。
    } else {
      //PS:标准Stack中是没有取出栈底元素的方法的，这里只是为了实现完整的队列，真实的题目可以参考LeetCode 232
      return this.outStack[0];
    }
  }

  /**
   * @description 判断队列是否为空
   * @returns {boolean}
   */
  empty() {
    return !this.inStack.length && !this.outStack.length;
  }
}

const q = new Queue();
q.push(1);
q.push(2);
q.push(3);
q.push(4);
q.push(5);
console.log(q.front());
console.log(q.back());
q.pop();
console.log(q.front());
